home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / misc / unix / tracker_4_3.lzh / tracker / Amiga / events.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-13  |  2.9 KB  |  158 lines

  1. /* events.c 
  2.     vi:se ts=3 sw=3:
  3.  */
  4. /* global events handler mechanism */
  5.  
  6. /* $Id: events.c,v 1.3 1994/01/09 17:38:28 Espie Exp Espie $
  7.  * $Log: events.c,v $
  8.  * Revision 1.3  1994/01/09  17:38:28  Espie
  9.  * Generalized open.c.
  10.  *
  11.  * Revision 1.2  1994/01/09  04:49:18  Espie
  12.  * File requester !
  13.  *
  14.  * Revision 1.1  1994/01/08  19:45:29  Espie
  15.  * Initial revision
  16.  *
  17.  */
  18.  
  19. #include <proto/exec.h>
  20. #include <dos/dos.h>
  21. #include "defs.h"
  22. #include "extern.h"
  23. #include "amiga/amiga.h"
  24.  
  25. ID("$Id: events.c,v 1.3 1994/01/09 17:38:28 Espie Exp Espie $")
  26.  
  27. LOCAL void init_events(void);
  28. LOCAL void (*INIT)(void) = init_events;
  29.  
  30. #define NUMBER_SIGNALS 32
  31.  
  32. LOCAL struct event_manager
  33.    {
  34.    ULONG    mask;       /* mask of signals we might wait for */
  35.    ULONG    req_mask;   /* special requester handler */
  36.    void     (*req_f)P((ULONG received));
  37.  
  38.    struct hook
  39.       {
  40.       void (*f)P((GENERIC data));
  41.       GENERIC data;
  42.       } hook[NUMBER_SIGNALS];
  43.    } manager;
  44.  
  45.  
  46. void install_signal_handler(int signal, void (*f)P((GENERIC data)), GENERIC data)
  47.    {
  48.    ULONG sigmask = 1 << signal;
  49.    
  50.    INIT_ONCE;
  51.    
  52.    if (f)
  53.       {
  54.       manager.mask |= sigmask;
  55.       manager.hook[signal].f = f;
  56.       manager.hook[signal].data = data;
  57.       }
  58.    else
  59.       {
  60.       manager.mask &= ~signal;
  61.       manager.hook[signal].f = 0;
  62.       }
  63.    }
  64.  
  65. void remove_signal_handler(int signal)
  66.    {
  67.    install_signal_handler(signal, 0, 0);
  68.    }
  69.  
  70. /* special case for reqtools.library ! */
  71. void install_req_handler(ULONG mask, void (*req_f)P((ULONG received)))
  72.    {
  73.    INIT_ONCE;
  74.  
  75.    if (req_f)
  76.       {
  77.       manager.req_mask = mask;
  78.       manager.req_f = req_f;
  79.       }
  80.    else
  81.       {
  82.       manager.req_mask = 0;
  83.       manager.req_f = 0;
  84.       }
  85.    }
  86.  
  87. void remove_req_handler(void)
  88.    {
  89.    install_req_handler(0, 0);
  90.    }
  91.  
  92. LOCAL void handle_events(ULONG received)
  93.    {
  94.    int i; 
  95.    ULONG mask;
  96.  
  97.    if ((received & manager.req_mask) && manager.req_f)
  98.       (*manager.req_f)(received & manager.req_mask);
  99.     for (i = 0, mask = 1; i < NUMBER_SIGNALS; i++, mask <<= 1)
  100.         if ((received & mask) && manager.hook[i].f)
  101.            (*manager.hook[i].f)(manager.hook[i].data);
  102.    }
  103.  
  104. void await_events()
  105.    {
  106.    ULONG received;
  107.    
  108.    INIT_ONCE;
  109.    received = Wait(manager.mask | manager.req_mask);
  110.    handle_events(received);
  111.    }
  112.  
  113. void check_events()
  114.    {
  115.    ULONG received;
  116.  
  117.    INIT_ONCE;
  118.    received = SetSignal(0, 0) & (manager.mask | manager.req_mask);
  119.       /* Clear signals received */
  120.    SetSignal(0, received);
  121.    handle_events(received);
  122.    }
  123.  
  124.  
  125. LOCAL boolean ask_break = FALSE;
  126.  
  127. void set_break()
  128.    {
  129.    ask_break = TRUE;
  130.    }
  131.  
  132. LOCAL void handle_ctrl_c(GENERIC nothing)
  133.    {
  134.    set_break();
  135.    }
  136.  
  137. LOCAL void init_events()
  138.    {
  139.    int i;
  140.  
  141.    manager.mask = 0;
  142.    manager.req_mask = 0;
  143.    manager.req_f = 0;
  144.    for (i = 0; i < NUMBER_SIGNALS; i++)
  145.       manager.hook[i].f = 0;
  146.       
  147.    install_signal_handler(SIGBREAKB_CTRL_C, handle_ctrl_c, 0);
  148.    }
  149.    
  150. boolean checkbrk()
  151.    {
  152.    INIT_ONCE;
  153.  
  154.    check_events();
  155.    return ask_break;
  156.    }
  157.  
  158.